<?php

// +----------------------------------------------------------------------
// | 应用程序类 执行应用过程管理
// +----------------------------------------------------------------------

class app {

	//运行应用实例 入口文件使用的快捷方法
	static public function run() {
		app::init();
		// 记录应用初始化时间
		if (C('sys_show_run_time'))   $GLOBALS['sys_time_init'] = microtime(TRUE);
		app::exec();
		// 保存日志记录
		if (C('sys_log_record'))   log::save();
		return;
	}

	//应用程序初始化
	static public function init() {

		//设定错误和异常的自定义处理
		set_error_handler(array('app', 'appError'));
		set_exception_handler(array('app', 'appException'));

		//加载模块配置
		if (is_file(MODULE_PATH . '/config/config.inc.php')) {
			C(include MODULE_PATH . '/config/config.inc.php');
		}

		//加载模块函数
		if (is_file(MODULE_PATH . '/function/function.fun.php')) {
			include (MODULE_PATH . '/function/function.fun.php');
		}

		if (C('sys_debug')) {
			//加载框架调试配置
			C(include FEE_PATH . '/config/debug.inc.php');
			//加载模块调试配置
			if (is_file(MODULE_PATH . '/config/debug.inc.php')) {
				C(include (MODULE_PATH . '/config/debug.inc.php'));
			}
		}

		if (C('sys_session_start'))  session_start();

		app::checkLanguage();  //语言检查
		app::checkTemplate();  //模板检查

		// 开启静态缓存
		if (C('sys_html_cache'))   html_cache::readHTMLCache();
		return;
	}

	//语言检查 检查浏览器支持语言，并自动加载语言包
	static private function checkLanguage() {
		$langSet = C('sys_default_lang');

		// 不开启语言包功能，仅仅加载框架语言文件直接返回
		if (!C('sys_lang_switch')) {
			L(include FEE_PATH . '/lang/' . $langSet . '.php');
			return;
		}

		// 通过url变更语言
        if(isset($_GET[C('var_lang')])){
            $langSet = $_GET[C('var_lang')];
            cookie('fee_language',$langSet,3600);
        }elseif(cookie('fee_language')){
			// 获取上次用户的选择
            $langSet = cookie('fee_language');
		}

        // 自动侦测浏览器语言
        if (C('sys_lang_auto') && isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) ){
            preg_match('/^([a-z\-]+)/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $matches);
            $langSet = strtolower($matches[1]);
            cookie('fee_language',$langSet,3600);
        }

		// 定义当前语言
		define('LANG_SET', strtolower($langSet));

		// 加载框架语言包
		L(include FEE_PATH . '/lang/' . LANG_SET . '.php');

		//加载模块语言包
		if (is_file(MODULE_PATH . '/lang/' . LANG_SET . '.php'))
			L(include MODULE_PATH . '/lang/' . LANG_SET . '.php');
	}

	//模板检查，如果不存在使用默认
	static private function checkTemplate() {

		if (C('sys_tpl_detect')) { // 自动侦测模板主题
			$t = C('var_tpl');
			if (isset($_GET[$t])) {
				$tplSet = $_GET[$t];
				cookie('template', $tplSet, 3600);
			} else {
				if (cookie('template')) {
					$tplSet = cookie('template');
				} else {
					$tplSet = C('sys_default_theme');
					cookie('template', $tplSet, 3600);
				}
			}			
			//模版主题不存在的话，使用默认模版主题
			if (!is_dir(TPL_PATH . '/' . $tplSet))
				$tplSet = C('sys_default_theme');
		}else {
			$tplSet = C('sys_default_theme');
		}

		//模版主题名称
		define('THEME_NAME', $tplSet);

		//当前模版主题路径
		define('THEME_PATH', TPL_PATH . '/' . $tplSet);

		//模版缓存路径
		C('app_tpl_cachepath', CACHE_PATH . '/tpl/' . MODULE_NAME);
		//当前操作默认模版
		C('app_tpl_filename', THEME_PATH . '/' . CONTROLLER_NAME . '_' . ACTION_NAME . C('sys_tpl_suffix'));
		
		//模板前台目录
		define('_TPL_', _ROOT_ . '/' . APP_NAME . '/' . MODULE_NAME . '/' . TPL_DIR);
		//模板主题前台目录
		define('_THEME_', _TPL_ . '/' . $tplSet);
		//网站前台静态数据目录
		if(!defined('_STATIC_'))  define('_STATIC_', _ROOT_ . '/static');
		//网站前台静态数据目录
		if(!defined('STATIC_PATH'))  define('STATIC_PATH', APP_PATH . '/static');
		//附件上传目录
		if(!defined('_UPLOAD_'))  define('_UPLOAD_', _STATIC_.'/uploads');
		//附件上传绝对路径
		if(!defined('UPLOAD_PATH'))  define('UPLOAD_PATH', STATIC_PATH.'/uploads');
		//模版前台静态数据目录
		define('_TPL_STATIC_', _STATIC_.'/'.MODULE_NAME);
		return;
	}

	//执行应用程序
	static public function exec() {
		//模块名称安全检测
		if (!preg_match('/^[A-Za-z_0-9]+$/', MODULE_NAME)) {
			throw_exception(L('_CONTROLLER_NOT_EXIST_'));
		}
		//创建控制器实例
		$module = A(CONTROLLER_NAME, MODULE_NAME);
		if (!$module) {
			// 是否定义Empty控制器
			$module = A('empty', MODULE_NAME);
			if (!$module)
				throw_exception(L('_CONTROLLER_NOT_EXIST_') . ' ' . MODULE_NAME . '/' . CONTROLLER_NAME . '_controller.class.php');
		}
		call_user_func(array(&$module, ACTION_NAME)); //执行操作
		return;
	}

	/**
	 * 自定义异常处理
	 * @param mixed $e 异常对象
	 */
	static public function appException($e) {
		halt($e->__toString());
	}

	/**
	 * 自定义错误处理
	 * @param int $errno 错误类型
	 * @param string $errstr 错误信息
	 * @param string $errfile 错误文件
	 * @param int $errline 错误行数
	 * @return void
	 */
	static public function appError($errno, $errstr, $errfile, $errline) {
		switch ($errno) {
			case E_ERROR:
			case E_USER_ERROR:
				$errorStr = "[$errno] $errstr " . basename($errfile) . " 第 $errline 行.";
				if (C('sys_log_record'))
					log::write($errorStr, log::ERR);
				halt($errorStr);
				break;
			case E_STRICT:
			case E_USER_WARNING:
			case E_USER_NOTICE:
			default:
				$errorStr = "[$errno] $errstr " . basename($errfile) . " 第 $errline 行.";
				log::record($errorStr, log::NOTICE);
				break;
		}
	}

}

?>